#include <iostream>
using namespace std;

struct Ref {
  const char &r; // 引用通常不为空，初始化后也不能再指向其他对象。
  Ref(char &x) : r(x) { // 引用可以初始化其他引用。
    // 引用的sizeof()和取地址(&)结果与引用的目标相同。
    cout << sizeof(r) << ' ' << (void*)&r << endl;
  }
};

int main() {
  char c;
  Ref o(c);
  cout << sizeof(c) << ' ' << (void*)&c << endl;
  cout << sizeof(o) << ' ' << (void*)&o << endl;
  /*    但Ref大小并不是1字节，而是8字节，与指针等长（64位环境）。
  猜测：引用相当于指针常量，本身也占空间，Ref实际含有一个指针。
  验证：把o的地址强制转为二级指针、然后解引用、输出指针的值。
        恰好就是c的地址。验证了猜测。 */
  cout << "  " << *(void**)&o << endl;
}